package com.cowmooed.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.util.Date;

/**
 * 日期处理切面
 * 用于统一设置实体类的创建时间和更新时间
 */
@Aspect
@Component
public class DateAspect {
    
    /**
     * 定义切入点，匹配带有DateHandle注解的方法
     */
    @Pointcut("@annotation(com.cowmooed.annotation.DateAnnotation)")
    public void datePointCut() {
    }
    
    /**
     * 在方法执行前设置日期字段
     */
    @Before("datePointCut()")
    public void before(JoinPoint joinPoint) throws Throwable {
        // 获取方法参数
        Object[] args = joinPoint.getArgs();
        if (args == null || args.length == 0) {
            return;
        }
        
        // 遍历所有参数，为包含日期字段的实体类设置日期
        for (Object arg : args) {
            if (arg == null) {
                continue;
            }
            
            // 获取参数的类
            Class<?> clazz = arg.getClass();
            
            try {
                // 尝试设置创建时间
                Field createTimeField = null;
                try {
                    createTimeField = clazz.getDeclaredField("createTime");
                } catch (NoSuchFieldException e) {
                    // 忽略没有createTime字段的类
                }
                
                if (createTimeField != null) {
                    createTimeField.setAccessible(true);
                    Object createTimeValue = createTimeField.get(arg);
                    // 如果createTime为null，则设置当前时间
                    if (createTimeValue == null) {
                        createTimeField.set(arg, new Date());
                    }
                }
                
                // 尝试设置更新时间
                Field updateTimeField = null;
                try {
                    updateTimeField = clazz.getDeclaredField("updateTime");
                } catch (NoSuchFieldException e) {
                    // 忽略没有updateTime字段的类
                }
                
                if (updateTimeField != null) {
                    updateTimeField.setAccessible(true);
                    // 无论updateTime是否为null，都设置为当前时间
                    updateTimeField.set(arg, new Date());
                }
            } catch (Exception e) {
                // 忽略反射异常
            }
        }
    }
}